﻿#ifndef NETWORKCOMMUNICATION_H
#define NETWORKCOMMUNICATION_H

//Macro
#define WAITE_FOR_CONNECT 3000  //设置等待连接时间
#define WAITE_FOR_RESPONSE 3000 //设置响应报文超时时长3000ms
#define RESENDNUMBER 3        //设置超时重发次数为3次

//Basic
#include <QObject>

//Demand
#include "plc_interface_base.h"
#include "networkParameters.h"

class NetworkCommunication : public PLC_Interface_Base
{
    Q_OBJECT
public:
    NetworkCommunication(CommunicationProtocol protocal, networkParameters netPara);
    virtual ~NetworkCommunication(){}

    //重载连接函数
    bool Connect() override;
    //重载断开函数
    void DisConnect() override;

public:
    /*重载报文发送函数
     * 参数：发送的报文
     * 返回：0：发送失败
     *      1：发送成功
     * */
    int MessageSend(const QByteArray &arr) override;

    /*重载报文接收函数
     * 参数：接收报文数组
     * 返回：true：接收成功
     *      false：接收失败
     * */
    bool MessageReceive(QByteArray &arr) override;

protected:
    //声明网络参数结构体
    networkParameters parameters;
    //声明tcp套接字
    QTcpSocket *tcpSocket;
    //声明网络状态标识
    bool networkStatus = false;
    //设置请求报文发送状态，设置在线请求报文只能有一个，默认为未发送状态
    bool networkSendIdentifier = false;
    //初始化超时重传次数
    int resendNumber;

signals:
    //当连接状态改变时，发送该信号，参数为连接状态
    void connectionChangedSignal(const bool networkStatus);
    //请求报文发送完毕，发送该信号
    void requestMessageSendOverSignal();
    //重传失败信号，标识未收到对方响应，将清楚请求报文数组
    void resendMessageFail();
    //接收到报文时，发送该信号
    void receivedAMessageSignal();
};

#endif // NETWORKCOMMUNICATION_H
